package com.wang.jmonkey.modules.system.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageInfo;
import com.wang.jmonkey.common.utils.TreeUtil;
import com.wang.jmonkey.modules.system.mapper.SystemDictMapper;
import com.wang.jmonkey.modules.system.model.dto.SystemDictTreeDto;
import com.wang.jmonkey.modules.system.model.entity.SystemDictEntity;
import com.wang.jmonkey.modules.system.model.query.SystemDictQuery;
import com.wang.jmonkey.modules.system.service.SystemDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;

/**
 * 字典表(SystemDict)表服务实现类
 *
 * @author HeJiawang
 * @since 2021-05-21 21:44:49
 */
@Service
public class SystemDictServiceImpl extends ServiceImpl<SystemDictMapper, SystemDictEntity> implements SystemDictService {

    /**
     * mapper
     */
    @Autowired
    private SystemDictMapper mapper;

    /**
     * 字典信息管理——分页查询
     * @param query 查询条件
     * @return 字典树形数据
     */
    @Override
    public PageInfo<SystemDictTreeDto> page(SystemDictQuery query) {
        List<SystemDictTreeDto> treeList = mapper.listTree(query);
        List<SystemDictTreeDto> list = TreeUtil.build(treeList);

        int current = Integer.valueOf(query.getCurrent()),size = Integer.valueOf(query.getPageSize());
        int start = size * ( current - 1 ) > list.size() ? list.size() : size * ( current - 1 ),
                end = size * current > list.size() ? list.size() : size * current;

        PageInfo<SystemDictTreeDto> pageInfo = new PageInfo<>(list.subList(start, end));
        pageInfo.setTotal(list.size());
        return pageInfo;
    }

    /**
     * 删除字典信息
     * @param id 字典id
     * @return true 删除成功
     */
    @Transactional
    @Override
    public boolean removeById(Serializable id) {
        List<SystemDictEntity> dictList = mapper.listChildren(id);

        if (CollUtil.isNotEmpty(dictList)) {
            dictList.forEach(dict -> this.removeById(dict.getId()) );
        }

        return super.removeById(id);
    }

    /**
     * 校验字典键值是否重复 </br>
     * 在同字典信息下（parentId）
     * @param dict 字典信息
     * @return true 重复
     */
    @Override
    public boolean checkValue(SystemDictEntity dict) {
        return mapper.checkValue(dict) > 0;
    }

    /**
     * 获取子集字典信息
     * @param parentValue 父级字典键值
     * @return 字典信息集合
     */
    @Override
    public List<SystemDictEntity> listChildren(String parentValue) {
        return mapper.listChildrenByParentValue(parentValue);
    }
}
